package com.hezhou.jenkins.my_jenkins_test.rabbitmq;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * ---------------------------
 * (Consumer) 消费者
 * ---------------------------
 *
 * @Author: [hezhou]
 * @Date: 2020/4/24
 * @Version: [1.0.1]
 * ---------------------------
 */
public class Consumer4Direct {
    public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
        //1.创建出一个连接工厂对象
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.121.130");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/");
        //2.通过连接工厂创建出连接对象
        Connection connection = connectionFactory.newConnection();
        //通过连接对象创建channel
        Channel channel = connection.createChannel();
        //4.创建出消息队列
        /**
         * 第一个参数  创建这个消息队列的名称
         * 第二个参数  消息是否持久化(关闭服务服务挂了下次重启是否能拿到这个数据)
         * 第三个参数  表示消息队列是否被channel独占
         * 第四个参数  表示是否自动删除，当消息队列没有绑定交换机是否自动删除
         * 第五个参数  消息队列的扩展参数
         */
        String queueName = "test_queue";
        channel.queueDeclare(queueName,true,false,false,null);
        //声明交换机
        String exchangeName = "test_direct";
        String exchangeType = "direct";
        channel.exchangeDeclare(exchangeName,exchangeType,true,false,null);
        //让交换机和消息队列绑定
        String routingKey = "test.direct";
        channel.queueBind(queueName,exchangeName,routingKey);
        //5.创建出消费者
        QueueingConsumer consumer = new QueueingConsumer(channel);
        //6.消费者和消息队列通过channel进行关联
        /**
         * 第一个参数  消息队列的名称
         * 第二个参数  是否自动签收-->消费者消费消息后 是否告知服务器消息已经被处理
         * 第三个参数  消费者
         */
        channel.basicConsume(queueName,true,consumer);
        //7.获取消息后对消息就行处理
        while(true){
            //获取到所有的消息
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            //获取到消息的内容
            byte[] body = delivery.getBody();
            String info = new String(body);
            System.out.println("消费端获取到的消息"+info);
        }

    }
}
